昨天介紹完單層感知機模型演算法,今天要來研究單層感知機模型程式:
首先先把x資料做標準化
#個別標準化處理
x['x1']=(x['x1']-np.mean(x['x1']))/np.std(x['x1'])
x['x2']=(x['x2']-np.mean(x['x2']))/np.std(x['x2'])
x['x3']=(x['x3']-np.mean(x['x3']))/np.std(x['x3'])
print(x)
結果如下:
x1 x2 x3
0 0.132453 0.707423 -0.324462
1 -0.927173 -0.771813 -0.633474
2 -0.662266 -1.380911 -1.096991
3 0.132453 -0.293237 2.147631
4 2.516611 1.264312 -0.169956
5 -0.662266 -0.750060 0.293561
6 -0.927173 -0.249730 -0.942485
7 0.927173 1.647173 -0.324462
8 -0.397360 0.903204 1.529608
9 -0.132453 -1.076362 -0.478968
好,接下來依照多元回歸,要加上截距項係數1:
x['b0']=1
print(x)
所以x資料就會變成:
x1 x2 x3 b0
0 0.132453 0.707423 -0.324462 1
1 -0.927173 -0.771813 -0.633474 1
2 -0.662266 -1.380911 -1.096991 1
3 0.132453 -0.293237 2.147631 1
4 2.516611 1.264312 -0.169956 1
5 -0.662266 -0.750060 0.293561 1
6 -0.927173 -0.249730 -0.942485 1
7 0.927173 1.647173 -0.324462 1
8 -0.397360 0.903204 1.529608 1
9 -0.132453 -1.076362 -0.478968 1
好,現在取前6筆當train後4筆當test,程式如下:
#取前6筆當train
x_train=x.loc[:5]
#取後4筆當test
x_test=x.loc[6:]
print(x_train)
print(x_test)
y_train=y.loc[:5]
y_test=y.loc[6:]
print(y_train)
print(y_test)
接下來定義誤差和學習率跟設定初始權重
程式如下:
#定義誤差容許值
err_check = 3.0
#定義學習率a
a = 0.05
#設定初始權重(因為有4個)-->用0~1之間的數字
w = np.random.uniform(0,1,4)
print(w)
#迭帶次數初始化
j=1
所以東西都設定好之後,就帶入迴圈:
while True:
err = 0
for i in range(len(x_train)):
xi = x_train.iloc[i]
#每一筆數據的估計值和真實值之間差距
delta = sum(w*xi) - y_train.iloc[i]
#梯度下降
w = w - a*delta*xi
#加總全誤差
err = err + delta**2
if err<err_check:
break
j+=1
#最後權重
print("最後權重",w)
結果如下:
第 1 次誤差: 2514.475600015955
第 2 次誤差: 1122.517976696326
第 3 次誤差: 536.2183368067888
第 4 次誤差: 267.1491980566654
第 5 次誤差: 138.1212899719169
第 6 次誤差: 74.86140081797406
第 7 次誤差: 43.39858391807849
第 8 次誤差: 27.509587072742484
第 9 次誤差: 19.29828752645391
第 10 次誤差: 14.891503014883892
第 11 次誤差: 12.38340474428632
第 12 次誤差: 10.834745064265665
第 13 次誤差: 9.781894680740534
第 14 次誤差: 8.995331217720498
第 15 次誤差: 8.360752340474864
第 16 次誤差: 7.820559609915683
第 17 次誤差: 7.345072473543037
第 18 次誤差: 6.918379442228294
第 19 次誤差: 6.5313914204590136
第 20 次誤差: 6.178435490364901
第 21 次誤差: 5.855586700477396
第 22 次誤差: 5.5598513534328395
第 23 次誤差: 5.2887663458100995
第 24 次誤差: 5.040201089221789
第 25 次誤差: 4.812257659580057
第 26 次誤差: 4.603218367670186
第 27 次誤差: 4.411516151619314
第 28 次誤差: 4.235715969835322
第 29 次誤差: 4.074501569242124
第 30 次誤差: 3.926664985200385
第 31 次誤差: 3.7910975487051513
第 32 次誤差: 3.666781841715461
第 33 次誤差: 3.552784346605619
第 34 次誤差: 3.4482486713465024
第 35 次誤差: 3.3523892895601275
第 36 次誤差: 3.264485757316709
第 37 次誤差: 3.1838773765485424
第 38 次誤差: 3.109958277295673
第 39 次誤差: 3.0421728915578936
第 40 次誤差: 2.9800117918450866
最後權重
x1 9.784756
x2 -2.149323
x3 -0.696641
b0 17.955527
很明顯可以看到誤差慢慢在下降
把上述得到權重帶回test,程式如下:
#預測值
y_hat=np.sum(x_test*w,axis=1)
print("每筆資料預測值:\n",y_hat)
#真實值
print("每筆資料真實值:\n",y_test)
#MSE
print("MSE:",np.mean((y_test -y_hat )**2))
結果如下:
每筆資料預測值:
6 10.070166
7 23.702478
8 11.048403
9 19.311501
每筆資料真實值:
6 12.03
7 29.00
8 21.50
9 13.75
MSE: 43.017715641520184
能看出MSE還是比較來的大(畢竟是單層感知機模型)
好,今天單層感知機模型算是完成,明天就來研究淺層網路神經
男孩站起身來,但眼神失了焦,而彷彿甚麼也沒看到的緩慢往前走,途中掉落木棉花在碰到男孩瞬間,花就立刻枯萎腐爛,然後消失在空氣中,男孩前進方向正是森林的入口,隨著男孩身影逐漸遠去,眾人發現身體又可以活動了,在第一時間,狐狸想立刻去追男孩,但他突然發現,他無法出去,在掉落木棉花上方,像是有一道無形的牆,而掉落木棉花正好形成一個圓圈,把眾人都困在裡面,男子伸出紅色的手,想企圖用火焰把牆燒掉,但卻毫無反應,娃娃抬起手,也毫無反應,這時透明牆上出現一段紅色字體,上面寫:
過去是疼痛,現在是折磨,未來是孤獨
--|我失去了過去,看清了現在,至於未來…|-- MM.CS